﻿#define _CRT_SECURE_NO_WARNINGS 1
// 原题连接：https://ac.nowcoder.com/acm/contest/5600/I
/*
题目描述：
链接：https://ac.nowcoder.com/acm/contest/5600/I
来源：牛客网

题目描述
牛牛在玩一个游戏：
一共有n行m列共n*m个方格，每个方格中有一个整数。
牛牛选择一个方格，可以得到和这个方格同行、同列的所有数之和的得分。
例如：对于一个2*2的方格：
1 2
3 4
牛牛选择每个方格的得分如下：
6 7
8 9
因为1+2+3=6，1+2+4=7，1+3+4=8，2+3+4=9。
现在牛牛想知道下一步选择每个格子的得分情况，你可以帮帮他吗？
输入描述:
第一行有两个正整数
𝑛

n  和
𝑚

m  ，代表方格的行数和列数。
（
1
≤
𝑛
∗
𝑚
≤
1000000
）

（1≤n∗m≤1000000）
接下来的
𝑛

n  行，每行有
𝑚

m  个数
𝑎
𝑖
𝑗
a
ij
​
 ，代表每个方格中的整数。
（
−
1
0
9
≤
𝑎
𝑖
𝑗
≤
1
0
9
）

（−10
9
 ≤a
ij
​
 ≤10
9
 ）
输出描述:
输出
𝑛

n  行
𝑚

m  列整数，分别代表选择每个位置方格的得分情况。
示例1
输入
复制
2 2
1 2
3 4
输出
复制
6 7
8 9
备注:
本题输入和输出数据量较大，尽量使用scanf或更快的IO方式~
*/


#include <iostream>
using namespace std;
const int N = 1e6 + 10;
long long row[N], col[N];
int main() {
    int n = 0, m = 0;
    scanf("%d%d", &n, &m);
    int grid[n][m];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d", &grid[i][j]);
            row[i] += grid[i][j];
            col[j] += grid[i][j];
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            printf("%lld ", row[i] + col[j] - grid[i][j]);
        }
        printf("\n");
    }

    return 0;
}